package service

import (
	"errors"
	"sync"
	"time"

	"pbj-server/pkg/logger"
	"pbj-server/pkg/sms"
	// "pbj-server/pkg/redis"  // 暂时禁用Redis
)

// SMSService SMS服务
type SMSService struct{}

// 内存存储（替代Redis）
var (
	rateLimitStore = make(map[string]time.Time)  // 频率限制存储
	countStore     = make(map[string]int)        // 发送次数存储
	storeMutex     sync.RWMutex
)

// NewSMSService 创建SMS服务实例
func NewSMSService() *SMSService {
	return &SMSService{}
}

// SendSMSRequest 发送短信请求
type SendSMSRequest struct {
	Phone string `json:"phone" binding:"required,len=11"` // 手机号
}

// SendSMSResponse 发送短信响应
type SendSMSResponse struct {
	Success bool   `json:"success"` // 是否成功
	Message string `json:"message"` // 消息
	Code    string `json:"code"`    // 验证码（仅开发环境返回）
}

// VerifyCodeRequest 验证验证码请求
type VerifyCodeRequest struct {
	Phone string `json:"phone" binding:"required,len=11"` // 手机号
	Code  string `json:"code" binding:"required,len=6"`   // 验证码
}

// VerifyCodeResponse 验证验证码响应
type VerifyCodeResponse struct {
	Success bool   `json:"success"` // 是否成功
	Message string `json:"message"` // 消息
}

// SendSMS 发送短信验证码
func (s *SMSService) SendSMS(req *SendSMSRequest) (*SendSMSResponse, error) {
	// 验证手机号格式
	if !sms.IsPhoneValid(req.Phone) {
		return &SendSMSResponse{
			Success: false,
			Message: "手机号格式不正确",
		}, nil
	}
	
	// 检查发送频率限制（1分钟内只能发送一次）
	rateLimitKey := "sms:rate_limit:" + req.Phone
	storeMutex.Lock()
	lastSendTime, exists := rateLimitStore[rateLimitKey]
	storeMutex.Unlock()
	
	if exists && time.Since(lastSendTime) < time.Minute {
		return &SendSMSResponse{
			Success: false,
			Message: "发送过于频繁，请稍后再试",
		}, nil
	}
	
	// 发送验证码
	code, err := sms.SendVerificationCode(req.Phone)
	if err != nil {
		logger.Errorf("发送短信验证码失败: %v", err)
		return &SendSMSResponse{
			Success: false,
			Message: "发送失败，请稍后再试",
		}, err
	}
	
	// 设置发送频率限制（1分钟）
	storeMutex.Lock()
	rateLimitStore[rateLimitKey] = time.Now()
	storeMutex.Unlock()
	
	// 记录发送日志
	logger.Infof("短信验证码发送成功，手机号: %s", req.Phone)
	
	response := &SendSMSResponse{
		Success: true,
		Message: "验证码发送成功",
	}
	
	// 开发环境返回验证码
	if sms.GetProvider() == "development" {
		response.Code = code
	}
	
	return response, nil
}

// VerifyCode 验证验证码
func (s *SMSService) VerifyCode(req *VerifyCodeRequest) (*VerifyCodeResponse, error) {
	// 验证手机号格式
	if !sms.IsPhoneValid(req.Phone) {
		return &VerifyCodeResponse{
			Success: false,
			Message: "手机号格式不正确",
		}, nil
	}
	
	// 验证验证码
	valid, err := sms.VerifyCode(req.Phone, req.Code)
	if err != nil {
		logger.Errorf("验证验证码失败: %v", err)
		return &VerifyCodeResponse{
			Success: false,
			Message: "验证失败，请稍后再试",
		}, err
	}
	
	if !valid {
		return &VerifyCodeResponse{
			Success: false,
			Message: "验证码错误或已过期",
		}, nil
	}
	
	// 记录验证成功日志
	logger.Infof("短信验证码验证成功，手机号: %s", req.Phone)
	
	return &VerifyCodeResponse{
		Success: true,
		Message: "验证成功",
	}, nil
}

// GetSMSSendCount 获取短信发送次数
func (s *SMSService) GetSMSSendCount(phone string) (int, error) {
	key := "sms:count:" + phone
	storeMutex.RLock()
	count := countStore[key]
	storeMutex.RUnlock()
	return count, nil
}

// IncrementSMSSendCount 增加短信发送次数
func (s *SMSService) IncrementSMSSendCount(phone string) error {
	key := "sms:count:" + phone
	storeMutex.Lock()
	countStore[key]++
	storeMutex.Unlock()
	return nil
}

// CheckDailyLimit 检查每日发送限制
func (s *SMSService) CheckDailyLimit(phone string, limit int) (bool, error) {
	count, err := s.GetSMSSendCount(phone)
	if err != nil {
		return false, err
	}
	
	return count < limit, nil
}

// ResetDailyCount 重置每日发送次数
func (s *SMSService) ResetDailyCount(phone string) error {
	key := "sms:count:" + phone
	storeMutex.Lock()
	delete(countStore, key)
	storeMutex.Unlock()
	return nil
}

// GetSMSProvider 获取当前SMS提供商
func (s *SMSService) GetSMSProvider() string {
	return sms.GetProvider()
}

// ValidatePhoneNumber 验证手机号
func (s *SMSService) ValidatePhoneNumber(phone string) bool {
	return sms.IsPhoneValid(phone)
}

// SendCustomSMS 发送自定义短信（需要管理员权限）
func (s *SMSService) SendCustomSMS(phone, message string) error {
	// 验证手机号格式
	if !sms.IsPhoneValid(phone) {
		return errors.New("手机号格式不正确")
	}
	
	// 这里可以扩展发送自定义短信的逻辑
	// 目前只支持验证码短信，可以根据需要添加模板短信功能
	
	logger.Infof("发送自定义短信，手机号: %s, 内容: %s", phone, message)
	return nil
} 